"""
在函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数
我们把这个使用外部函数变量的内部函数称为闭包

优点：
    - 无需定义全局变量即可实现通过函数，持续的访问、修改某个值
    - 闭包使用的变量的作用域在函数内，难以被错误的调用修改

缺点：
    - 由于内部函数持续引用外部函数的值，所以会导致这一部分内存空间不被释放，一直占用内存
"""


# 普通定义，不安全
account_amount = 0
def atm(num,deposit=True):
    global account_amount
    if deposit:
        account_amount += num
        print(f"存款：+{num},账户余额：{account_amount}")
    else:
        account_amount -= num
        print(f"取款：-{num},账户余额{account_amount}")

# 闭包写法
def account_create(initial_amount=0):
    global account_amount


# 简单闭包
def outer(logo):

    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")

    return inner

fn1 = outer("黑马程序员")
fn1("大家好呀")
fn1("学Python就来")

fn2 = outer("船只教育")
fn2("IT教育")
fn2("学python就来")

# nonlocal可以修改num1
def outer2(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    return inner